﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;

namespace Libreria.DAL
{
    /// <summary>
    /// Esta clase será utilizada como anotación de las clases del modelo de una aplicación
    /// de modo que puedan ser utilizada en una capa de abstración de datos, para su persitencia.
    /// </summary>
    [System.AttributeUsage(System.AttributeTargets.All,
                           Inherited = true,
                           AllowMultiple = false)
    ]
    public class CAD : System.Attribute
    {
        // Atributos de la clase
        private bool esModelo;
        private bool nombreTablaIgualNombreClase = true;
        private TiposBD tipoBD;
        private string nombreTabla;

        // Encapsulamiento de los atributos
        [XmlIgnore]
        public bool NombreTablaIgualNombreClase
        {
            get
            {
                if (NombreTabla == null)
                {
                    nombreTablaIgualNombreClase = true;
                }
                return nombreTablaIgualNombreClase;
            }
        }
        [XmlIgnore]
        public string NombreTabla
        {
            get { return nombreTabla; }
        }
        [XmlIgnore]
        public bool EsModelo
        {
            get { return esModelo; }
        }
        [XmlIgnore]
        public TiposBD TipoBD
        {
            get { return tipoBD; }
        }

        // Listados a utilizar para evitar ambiguedad y errores de entrada de datos
        public enum TiposBD
        {
            _SQLServer = 1
        };

        /// <summary>
        /// Valido para construir una clase tipo modelo, cuya base de datos será por defecto MS SQL Server
        /// </summary>
        /// <param name="esModelo">especifica si la clase sera tipo modelo o no</param>
        public CAD(bool esModelo)
        {
            this.esModelo = esModelo;
            this.tipoBD = TiposBD._SQLServer;
        }

        /// <summary>
        /// Valido para construir una clase tipo modelo, cuya base de datos será definida por parámetro
        /// </summary>
        /// <param name="esModelo">especifica si la clase sera tipo modelo o no</param>
        /// <param name="nombreBD">especifica el nombre del tipo de base de datos, debe ser utilizada la Enumeracion TiposBD encontrada dentro de la clase CAD</param>
        public CAD(bool esModelo, TiposBD nombreBD)
        {
            this.esModelo = esModelo;
            this.tipoBD = nombreBD;
        }

        /// <summary>
        /// Valido para construir una clase tipo modelo, cuya base de datos será definida por parámetro
        /// </summary>
        /// <param name="esModelo">especifica si la clase sera tipo modelo o no</param>
        /// <param name="nombreTabla">especifica el nombre de la tabla a mapear en la base de datos</param>
        public CAD(bool esModelo, string nombreTabla)
        {
            this.esModelo = esModelo;
            this.nombreTabla = nombreTabla;
            this.nombreTablaIgualNombreClase = false;
        }

        /// <summary>
        /// Valido para construir una clase tipo modelo, cuya base de datos será definida por parámetro
        /// </summary>
        /// <param name="esModelo">especifica si la clase sera tipo modelo o no</param>
        /// <param name="nombreBD">especifica el nombre del tipo de base de datos, debe ser utilizada la Enumeracion TiposBD encontrada dentro de la clase CAD</param>
        /// <param name="nombreTabla">especifica el nombre de la tabla a mapear en la base de datos</param>
        public CAD(bool esModelo, TiposBD nombreBD, string nombreTabla)
        {
            this.esModelo = esModelo;
            this.tipoBD = nombreBD;
            this.nombreTabla = nombreTabla;
            this.nombreTablaIgualNombreClase = false;
        }
    }
}
